﻿using BCCommon.Enums;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Text;

namespace BCDto.MakeStaticPagingComponent.SystemServiceListing
{
    /// <summary>
    /// 系统服务列表模型
    /// </summary>
    public class SystemServiceListingDto
    {
        /// <summary>
        /// 系统服务列表Id
        /// </summary>
        public int SystemServiceListingId { get; set; }
        /// <summary>
        /// 网站模板Id
        /// </summary>
        public int WebsiteTemplateId { get; set; }
        /// <summary>
        /// 服务展示名称
        /// </summary>
        public string DisplayName { get; set; }
        /// <summary>
        /// 服务详细描述
        /// </summary>
        public string Description { get; set; }
        /// <summary>
        /// 系统服务名称
        /// </summary>
        public string ServiceName { get; set; }
        /// <summary>
        /// 服务接口方法名称
        /// </summary>
        public string MethodName { get; set; }
        /// <summary>
        /// 方法参数文本
        /// </summary>
        public string ParamsText { get; set; }
        /// <summary>
        /// 方法参数描述
        /// </summary>
        public string ParamsDesc { get; set; }
        /// <summary>
        /// 返回结果类型
        /// </summary>
        public StaticPageResultType ResultType { get; set; }
        /// <summary>
        /// 返回对象名称
        /// </summary>
        public string ResultEntityName { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime UpdateTime { get; set; }
        /// <summary>
        /// 系统默认服务列表
        /// </summary>
        public bool IsSystem { get; set; }
        /// <summary>
        /// 模板
        /// </summary>
        public string Template
        {
            get
            {
                StringBuilder str = new StringBuilder();
                switch (this.ResultType)
                {
                    case StaticPageResultType.Array:
                        {
                            str.AppendLine(@"{{#for(**i=0;i<=METHODTEMPLATE.length;**i++)#}}");
                            str.AppendLine(@"{{#/for#}}");
                            return str.ToString();
                        }
                    case StaticPageResultType.PageableList:
                        {
                            str.AppendLine(@"{{#BCPagingTag METHODTEMPLATE#}}");
                            str.AppendLine(@"   {{#BCTemplate#}}");
                            str.AppendLine(@"   {{#/BCTemplate#}}");
                            str.AppendLine(@"   {{#BCPagingTemplate#}}");
                            str.AppendLine(@"       <ul>");
                            str.AppendLine(@"           {{#BCPagingPreviousTemplate#}}");
                            str.AppendLine(@"               <li>{{$$previousPageIndex}}</li>");
                            str.AppendLine(@"           {{#/BCPagingPreviousTemplate#}}");
                            str.AppendLine(@"           {{#BCPagingListTemplate#}}");
                            str.AppendLine(@"               {{#BCPagingListDefaultTemplate#}}");
                            str.AppendLine(@"                   <li>{{$$pageIndex}}</li>");
                            str.AppendLine(@"               {{#/BCPagingListDefaultTemplate#}}");
                            str.AppendLine(@"               {{#BCPagingListActiveTemplate#}}");
                            str.AppendLine(@"                   <li class=\""active\"">{{$$pageIndex}}</li>");
                            str.AppendLine(@"               {{#/BCPagingListActiveTemplate#}}");
                            str.AppendLine(@"           {{#/BCPagingListTemplate#}}");
                            str.AppendLine(@"           {{#BCPagingNextTemplate#}}");
                            str.AppendLine(@"               <li>{{$$nextPageIndex}}</li>");
                            str.AppendLine(@"           {{#/BCPagingNextTemplate#}}");
                            str.AppendLine(@"       </ul>");
                            str.AppendLine(@"   {{#/BCPagingTemplate#}}");
                            str.AppendLine(@"{{#/BCPagingTag#}}");
                            return str.ToString();
                        }
                    case StaticPageResultType.Object:
                        {
                            str.AppendLine(@"{{ METHODTEMPLATE }}");
                            return str.ToString();
                        }
                    case StaticPageResultType.Value:
                        {
                            str.AppendLine(@"{{ METHODTEMPLATE }}");
                            return str.ToString();
                        }
                    default:
                        return "";
                }
            }
        }
        /// <summary>
        /// 使用示例
        /// </summary>
        public string ForExample
        {
            get
            {
                StringBuilder str = new StringBuilder();
                switch (this.ResultType)
                {
                    case StaticPageResultType.Array:
                        {
                            str.AppendLine(@"此服务接口返回类型为数组对象，因此，应使用循环模板进行展示，示例如下：");
                            str.AppendLine("");
                            str.AppendLine(@"{{#for(**i=0;**i<=&&work.length;**i++)#}}");
                            str.AppendLine(@"   <div>{{ **i@@name }}</div>");
                            str.AppendLine(@"{{#/for#}}");
                            str.AppendLine("");
                            str.AppendLine(@"列表数据接口，应以{{#for(**i=0;**i<=&&work.length;**i++)#}}开始，并以{{#/for#}}结束，开始于结束中间应为循环模板。");
                            str.AppendLine("");
                            str.AppendLine(@"其中**i为循环体内定义的下标索引，**i=0,代表会创建临时变量i用于循环体内使用**i来获取循环索引，&&work为页面数据定义中定义的数据集变量名称。{{@@name}}为&&work定义时返回的数据集的字段标签。");
                            str.AppendLine(@"通过使用**i@@name，系统会从&&work数据集中获取第i个结果对象，并根据@@name找到它的值来替换此位置!");
                            return str.ToString();
                        }
                    case StaticPageResultType.PageableList:
                        {
                            str.AppendLine(@"此服务接口返回类型为数组对象，且支持分页功能，因此，应使用循环模板进行展示，示例如下：");
                            str.AppendLine("");
                            str.AppendLine(@"{{#BCPagingTag &&work #}}");
                            str.AppendLine(@"   {{#BCTemplate#}}");
                            str.AppendLine(@"       <div>{{&&current_active_pagingdata@@name}}</div>");
                            str.AppendLine(@"   {{#/BCTemplate#}}");
                            str.AppendLine(@"   {{#BCPagingTemplate#}}");
                            str.AppendLine(@"       {{#BCPagingPreviousTemplate#}}");
                            str.AppendLine(@"           <div>{{$$previousPageIndex}}</div>");
                            str.AppendLine(@"       {{#/BCPagingPreviousTemplate#}}");
                            str.AppendLine(@"       {{#BCPagingListTemplate#}}");
                            str.AppendLine(@"           {{#BCPagingListDefaultTemplate#}}");
                            str.AppendLine(@"               <div>{{$$pageIndex}}</div>");
                            str.AppendLine(@"           {{#/BCPagingListDefaultTemplate#}}");
                            str.AppendLine(@"           {{#BCPagingListActiveTemplate#}}");
                            str.AppendLine(@"               <div class=\""active\"">{{$$pageIndex}}</div>");
                            str.AppendLine(@"           {{#/BCPagingListActiveTemplate#}}");
                            str.AppendLine(@"       {{#/BCPagingListTemplate#}}");
                            str.AppendLine(@"       {{#BCPagingNextTemplate#}}");
                            str.AppendLine(@"           <div>{{$$nextPageIndex}}</div>");
                            str.AppendLine(@"       {{#/BCPagingNextTemplate#}}");
                            str.AppendLine(@"   {{#/BCPagingTemplate#}}");
                            str.AppendLine(@"{{#/BCPagingTag#}}");
                            str.AppendLine("");
                            str.AppendLine(@"分页循环模板中数组列表内容循环模板，应以{{#BCTemplate#}}开始，并以{{#/BCTemplate#}}结束。");
                            str.AppendLine(@"{{&&current_active_pagingdata@@name}} 中的&&current_active_pagingdata是当前循环&&work的当前对象。");
                            str.AppendLine(@"通过解析 &&current_active_pagingdata@@name来获取对应的数组列表中的值，并替换此位置。");
                            str.AppendLine("");
                            str.AppendLine(@"注意：分页列表应仅在页面类型为分页列表页的页面使用，未标记为分页列表页的页面，此标签不会被解析替换成内容。");
                            str.AppendLine("");
                            str.AppendLine(@"{{#BCTemplate#}}与{{#/BCTemplate#}}之间为数组列表展示内容模板。");
                            str.AppendLine("");
                            str.AppendLine(@"{{#BCPagingTemplate#}}与{{#/BCPagingTemplate#}}之间为数据分页器模板。");
                            str.AppendLine("");
                            str.AppendLine(@"{{#BCPagingListTemplate#}}与{{#/BCPagingListTemplate#}}之间为分页列表数据展示模板。");
                            return str.ToString();
                        }
                    case StaticPageResultType.Object:
                        {
                            str.AppendLine(@"此服务接口返回类型为对象，示例如下：");
                            str.AppendLine("");
                            str.AppendLine(@"<div>{{ &&work@@name }}</div>");
                            str.AppendLine("");
                            str.AppendLine(@"对象返回结果应使用页面数据定义连接对象字段来获取相应的值。");
                            str.AppendLine("");
                            str.AppendLine(@"注意：请勿将&&work和@@name中间添加空格，否则将无法正确解析。");
                            return str.ToString();
                        }
                    case StaticPageResultType.Value:
                        {
                            str.AppendLine(@"返回类型为值时，因已在页面数据定义中定义此变量，所以这里我们直接通过 &&xxxx 来获取定义的变量即可！示例如下：");
                            str.AppendLine("");
                            str.AppendLine(@"{{&&name}}");
                            return str.ToString();
                        }
                    default:
                        return str.ToString();
                }
            }
        }
    }
}
